#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
重复文件查找工具 - 打包脚本
使用PyInstaller将应用打包为独立可执行文件
"""

import os
import sys
import subprocess
import shutil
from pathlib import Path

def clean_build_files():
    """清理之前的构建文件"""
    print("🧹 清理之前的构建文件...")
    
    # 需要清理的目录和文件
    clean_paths = [
        'build',
        'dist', 
        '__pycache__',
        '重复文件查找工具.exe',
        '重复文件查找工具_目录版'
    ]
    
    for path in clean_paths:
        if os.path.exists(path):
            if os.path.isfile(path):
                os.remove(path)
                print(f"  ✅ 删除文件: {path}")
            else:
                shutil.rmtree(path)
                print(f"  ✅ 删除目录: {path}")
    
    print("✅ 清理完成")

def check_dependencies():
    """检查必要的依赖"""
    print("🔍 检查依赖...")
    
    try:
        import tkinter
        print("  ✅ tkinter 已安装")
    except ImportError:
        print("  ❌ tkinter 未安装")
        return False
    
    try:
        import PyInstaller
        print("  ✅ PyInstaller 已安装")
    except ImportError:
        print("  ❌ PyInstaller 未安装，请运行: pip install PyInstaller")
        return False
    
    return True

def build_executable():
    """构建可执行文件"""
    print("🏗️ 开始构建可执行文件...")
    
    # 使用spec文件进行打包
    spec_file = "doufilefind.spec"
    
    if not os.path.exists(spec_file):
        print(f"❌ 找不到spec文件: {spec_file}")
        return False
    
    try:
        # 运行PyInstaller
        cmd = [
            sys.executable, "-m", "PyInstaller",
            "--clean",  # 清理缓存
            spec_file
        ]
        
        print(f"执行命令: {' '.join(cmd)}")
        result = subprocess.run(cmd, check=True, capture_output=True, text=True)
        
        print("✅ 构建成功!")
        return True
        
    except subprocess.CalledProcessError as e:
        print(f"❌ 构建失败: {e}")
        print("错误输出:", e.stderr)
        return False

def test_executable():
    """测试生成的可执行文件"""
    print("🧪 测试可执行文件...")
    
    exe_path = os.path.join("dist", "重复文件查找工具.exe")
    
    if not os.path.exists(exe_path):
        print(f"❌ 找不到可执行文件: {exe_path}")
        return False
    
    print(f"✅ 可执行文件已生成: {exe_path}")
    print(f"文件大小: {os.path.getsize(exe_path) / 1024 / 1024:.2f} MB")
    
    return True

def create_release_package():
    """创建发布包"""
    print("📦 创建发布包...")
    
    release_dir = "release"
    if os.path.exists(release_dir):
        shutil.rmtree(release_dir)
    
    os.makedirs(release_dir)
    
    # 复制可执行文件
    exe_source = os.path.join("dist", "重复文件查找工具.exe")
    exe_dest = os.path.join(release_dir, "重复文件查找工具.exe")
    
    if os.path.exists(exe_source):
        shutil.copy2(exe_source, exe_dest)
        print(f"  ✅ 复制可执行文件到: {exe_dest}")
    
    # 复制文档文件
    docs_to_copy = [
        "README.md",
        "docs/使用说明.md",
    ]
    
    for doc in docs_to_copy:
        if os.path.exists(doc):
            dest_path = os.path.join(release_dir, os.path.basename(doc))
            shutil.copy2(doc, dest_path)
            print(f"  ✅ 复制文档: {dest_path}")
    
    # 创建版本信息文件
    version_info = f"""重复文件查找工具 v2.0
构建时间: {__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
特性:
- PyQt5现代化界面
- Element UI设计风格  
- 空目录扫描功能
- 文件重复检测
- 批量删除操作
"""
    
    with open(os.path.join(release_dir, "版本信息.txt"), 'w', encoding='utf-8') as f:
        f.write(version_info)
    
    print(f"✅ 发布包已创建: {release_dir}/")
    return True

def main():
    """主函数"""
    print("=" * 60)
    print("🚀 重复文件查找工具 - 打包脚本")
    print("=" * 60)
    
    # 检查依赖
    if not check_dependencies():
        print("❌ 依赖检查失败，请安装必要的依赖后重试")
        return False
    
    # 清理旧文件
    clean_build_files()
    
    # 构建可执行文件
    if not build_executable():
        print("❌ 构建失败")
        return False
    
    # 测试可执行文件
    if not test_executable():
        print("❌ 测试失败")
        return False
    
    # 创建发布包
    if not create_release_package():
        print("❌ 创建发布包失败")
        return False
    
    print("=" * 60)
    print("🎉 打包完成！")
    print("📁 可执行文件位置: dist/重复文件查找工具.exe")
    print("📦 发布包位置: release/")
    print("=" * 60)
    
    return True

if __name__ == '__main__':
    success = main()
    input("按回车键退出...")
    sys.exit(0 if success else 1)